home *** CD-ROM | disk | FTP | other *** search
/ Sprite 1984 - 1993 / Sprite 1984 - 1993.iso / src / boot / diskBoot.OpenProm / RCS / fileLoad.c,v < prev    next >
Text File  |  1990-11-27  |  9KB  |  471 lines

  1. head     1.10;
  2. branch   ;
  3. access   ;
  4. symbols  ;
  5. locks    ; strict;
  6. comment  @ * @;
  7.  
  8.  
  9. 1.10
  10. date     90.11.27.11.17.25;  author jhh;  state Exp;
  11. branches ;
  12. next     1.9;
  13.  
  14. 1.9
  15. date     90.07.17.15.41.58;  author mendel;  state Exp;
  16. branches ;
  17. next     1.8;
  18.  
  19. 1.8
  20. date     90.07.16.16.20.36;  author mendel;  state Exp;
  21. branches ;
  22. next     1.7;
  23.  
  24. 1.7
  25. date     89.01.06.08.14.27;  author brent;  state Exp;
  26. branches ;
  27. next     1.6;
  28.  
  29. 1.6
  30. date     87.05.27.14.32.39;  author brent;  state Exp;
  31. branches ;
  32. next     1.5;
  33.  
  34. 1.5
  35. date     87.05.11.11.14.56;  author brent;  state Exp;
  36. branches ;
  37. next     1.4;
  38.  
  39. 1.4
  40. date     86.07.24.11.46.42;  author brent;  state Exp;
  41. branches ;
  42. next     1.3;
  43.  
  44. 1.3
  45. date     86.07.21.09.33.43;  author brent;  state Exp;
  46. branches ;
  47. next     1.2;
  48.  
  49. 1.2
  50. date     86.07.18.10.38.01;  author brent;  state Exp;
  51. branches ;
  52. next     1.1;
  53.  
  54. 1.1
  55. date     86.07.17.13.19.16;  author brent;  state Exp;
  56. branches ;
  57. next     ;
  58.  
  59.  
  60. desc
  61. @Routine to load a program into main memory
  62. @
  63.  
  64.  
  65. 1.10
  66. log
  67. @got it to compile, moved location for sun3 kernel
  68. @
  69. text
  70. @/* 
  71.  * fileLoad.c --
  72.  *
  73.  *    The routine to load a program into main memory.
  74.  *
  75.  * Copyright 1986 Regents of the University of California
  76.  * All rights reserved.
  77.  */
  78.  
  79. #ifdef notdef
  80. static char rcsid[] = "$Header: /sprite/src/boot/sunprom/RCS/fileLoad.c,v 1.9 90/07/17 15:41:58 mendel Exp Locker: jhh $ SPRITE (Berkeley)";
  81. #endif not lint
  82.  
  83. #include "sprite.h"
  84. #include "fsBoot.h"
  85. #include "procMach.h"
  86. #include "machMon.h"
  87. #include "boot.h"
  88.  
  89. #define KERNEL_ENTRY 0x4000
  90.  
  91.  
  92. /*
  93.  *----------------------------------------------------------------------
  94.  *
  95.  * FileLoad --
  96.  *
  97.  *    Read in the kernel object file.  This is loaded into memory at
  98.  *    a pre-defined location (in spite of what is in the a.out header)
  99.  *    for compatibility with Sun/UNIX boot programs.  The Sprite kernel
  100.  *    expects to be loaded into the wrong place and does some re-mapping
  101.  *    to relocate the kernel into high virtual memory.
  102.  *
  103.  * Results:
  104.  *    The entry point.
  105.  *
  106.  * Side effects:
  107.  *    None.
  108.  *
  109.  *----------------------------------------------------------------------
  110.  */
  111.  
  112.  
  113. int
  114. FileLoad(handlePtr)
  115.     register Fsio_FileIOHandle    *handlePtr;
  116. {
  117.     ProcExecHeader    aout;
  118.     int            bytesRead;
  119.     register int    *addr;
  120.     register ReturnStatus status;
  121.     register int    i;
  122.     register int    numBytes;
  123.  
  124.     /*
  125.      * Read a.out header.
  126.      */
  127.  
  128.     status = Read(handlePtr, 0, sizeof(aout), &aout, &bytesRead);
  129.     if (status != SUCCESS || bytesRead != sizeof(aout)) {
  130.     Mach_MonPrintf("No a.out header");
  131.     goto readError;
  132.     } else if (aout.magic != PROC_OMAGIC) {
  133.     Mach_MonPrintf("A.out? mag %x size %d+%d+%d\n",
  134.         aout.magic, aout.code, aout.data, aout.bss);
  135.     return(-1);
  136.     }
  137.  
  138.     /*
  139.      * Read the code.
  140.      */
  141.  
  142.     numBytes = aout.code;
  143.     Mach_MonPrintf("Size: %d", numBytes);
  144. #ifdef sun4
  145.     status = Read(handlePtr, PROC_CODE_FILE_OFFSET(aout), numBytes,
  146.               KERNEL_ENTRY + sizeof(aout), &bytesRead);
  147. #else
  148.     status = Read(handlePtr, PROC_CODE_FILE_OFFSET(aout), numBytes,
  149.               KERNEL_ENTRY, &bytesRead);
  150. #endif
  151.     if (status != SUCCESS) {
  152.     goto readError;
  153.     } else if (bytesRead != numBytes) {
  154.     goto shortRead;
  155.     }
  156.  
  157.     /*
  158.      * Read the initialized data.
  159.      */
  160.  
  161.     numBytes = aout.data;
  162.     Mach_MonPrintf("+%d", numBytes);
  163. #ifdef sun4
  164.     status = Read(handlePtr, PROC_DATA_FILE_OFFSET(aout), numBytes,
  165.               KERNEL_ENTRY + aout.code + sizeof(aout), &bytesRead);
  166. #else
  167.     status = Read(handlePtr, PROC_DATA_FILE_OFFSET(aout), numBytes,
  168.               KERNEL_ENTRY + aout.code, &bytesRead);
  169. #endif
  170.     if (status != SUCCESS) {
  171. readError:
  172.     Mach_MonPrintf("\nRead error <%x>\n", status);
  173.     return(-1);
  174.     } else if (bytesRead != numBytes) {
  175. shortRead:
  176.     Mach_MonPrintf("\nShort read (%d)\n", bytesRead);
  177.     return(-1);
  178.     }
  179.  
  180.     /*
  181.      * Zero out the bss.
  182.      */
  183.  
  184.     numBytes = aout.bss;
  185.     Mach_MonPrintf("+%d\n", numBytes);
  186. #ifdef sun4
  187.     addr = (int *) (KERNEL_ENTRY + aout.code + aout.data + sizeof(aout));
  188. #else
  189.     addr = (int *) (KERNEL_ENTRY + aout.code + aout.data);
  190. #endif
  191.     bzero(addr, numBytes);
  192. #ifdef sun4
  193.     return (KERNEL_ENTRY + sizeof(aout));
  194. #else
  195.     return (KERNEL_ENTRY);
  196. #endif
  197. }
  198. @
  199.  
  200.  
  201. 1.9
  202. log
  203. @*** empty log message ***
  204. @
  205. text
  206. @d11 1
  207. a11 1
  208. static char rcsid[] = "$Header: /sprite/src/boot/scsiDiskBoot/RCS/fileLoad.c,v 1.7 89/01/06 08:14:27 brent Exp $ SPRITE (Berkeley)";
  209. d59 1
  210. a59 1
  211.     status = Fs_Read(handlePtr, 0, sizeof(aout), &aout, &bytesRead);
  212. d76 1
  213. a76 1
  214.     status = Fs_Read(handlePtr, PROC_CODE_FILE_OFFSET(aout), numBytes,
  215. d79 1
  216. a79 1
  217.     status = Fs_Read(handlePtr, PROC_CODE_FILE_OFFSET(aout), numBytes,
  218. d95 1
  219. a95 1
  220.     status = Fs_Read(handlePtr, PROC_DATA_FILE_OFFSET(aout), numBytes,
  221. d98 1
  222. a98 1
  223.     status = Fs_Read(handlePtr, PROC_DATA_FILE_OFFSET(aout), numBytes,
  224. @
  225.  
  226.  
  227. 1.8
  228. log
  229. @*** empty log message ***
  230. @
  231. text
  232. @d75 1
  233. d77 3
  234. d81 1
  235. d94 4
  236. d100 1
  237. d117 3
  238. d121 1
  239. d123 3
  240. a125 1
  241.  
  242. d127 1
  243. @
  244.  
  245.  
  246. 1.7
  247. log
  248. @New include files and constants due to source reorganization
  249. @
  250. text
  251. @d10 2
  252. a11 2
  253. #ifndef lint
  254. static char rcsid[] = "$Header: fileLoad.c,v 1.6 87/05/27 14:32:39 brent Exp $ SPRITE (Berkeley)";
  255. d15 2
  256. a16 2
  257. #include "fs.h"
  258. #include "procAOUT.h"
  259. d18 1
  260. d46 1
  261. a46 1
  262.     register FsHandle    *handlePtr;
  263. d48 1
  264. a48 1
  265.     Proc_AOUT        aout;
  266. d64 1
  267. a64 1
  268.     Sys_Printf("A.out? mag %x size %d+%d+%d\n",
  269. d108 1
  270. a108 3
  271.     for (i = 0; i < numBytes; i += 4, addr++) {
  272.     *addr = 0;
  273.     }
  274. @
  275.  
  276.  
  277. 1.6
  278. log
  279. @messed with print statements.
  280. @
  281. text
  282. @d11 1
  283. a11 1
  284. static char rcsid[] = "$Header: fileLoad.c,v 1.5 87/05/11 11:14:56 brent Exp $ SPRITE (Berkeley)";
  285. d14 2
  286. d17 1
  287. a17 3
  288. #include "fs.h"
  289. #include "fsInt.h"
  290. #include "sunMon.h"
  291. d19 1
  292. a19 5
  293. /*
  294.  * The boot program always loads the kernel starting at this location.
  295.  * The kernel will remap itself to where it wants.
  296.  */
  297. #define KERNEL_ENTRY    0x4000
  298. d60 1
  299. a60 1
  300.     Mon_Printf("No a.out header");
  301. d73 1
  302. a73 1
  303.     Mon_Printf("Size: %d", numBytes);
  304. d87 1
  305. a87 1
  306.     Mon_Printf("+%d", numBytes);
  307. d92 1
  308. a92 1
  309.     Mon_Printf("\nRead error <%x>\n", status);
  310. d96 1
  311. a96 1
  312.     Mon_Printf("\nShort read (%d)\n", bytesRead);
  313. d105 1
  314. a105 1
  315.     Mon_Printf("+%d\n", numBytes);
  316. @
  317.  
  318.  
  319. 1.5
  320. log
  321. @Fixed so it always loads to the same place.  Stupid, but compatible
  322. with the Sun/UNIX boot programs so the kernel can deal.
  323. @
  324. text
  325. @d11 1
  326. a11 1
  327. static char rcsid[] = "$Header: fileLoad.c,v 1.4 86/07/24 11:46:42 brent Exp $ SPRITE (Berkeley)";
  328. d67 3
  329. a69 1
  330.     Mon_Printf("need 0%o a.out\n", PROC_OMAGIC);
  331. d109 1
  332. a109 1
  333.     Mon_Printf("+%d", numBytes);
  334. a114 1
  335.     Mon_Printf(" bytes\n");
  336. @
  337.  
  338.  
  339. 1.4
  340. log
  341. @more trimming
  342. @
  343. text
  344. @d11 1
  345. a11 1
  346. static char rcsid[] = "$Header: fileLoad.c,v 1.3 86/07/21 09:33:43 brent Exp $ SPRITE (Berkeley)";
  347. d19 6
  348. d31 5
  349. a35 1
  350.  *    Read in the kernel object file.
  351. a50 1
  352.     
  353. d77 1
  354. a77 1
  355.               aout.entry, &bytesRead);
  356. d91 1
  357. a91 1
  358.               aout.entry + aout.code, &bytesRead);
  359. d108 1
  360. a108 1
  361.     addr = (int *) (aout.entry + aout.code + aout.data);
  362. d114 1
  363. a114 1
  364.     return (aout.entry);
  365. @
  366.  
  367.  
  368. 1.3
  369. log
  370. @Did some scrunching, fixed a bug.
  371. @
  372. text
  373. @d11 1
  374. a11 1
  375. static char rcsid[] = "$Header: fileLoad.c,v 1.2 86/07/18 10:38:01 brent Exp $ SPRITE (Berkeley)";
  376. d47 1
  377. d54 5
  378. a58 4
  379.     if (status != SUCCESS || bytesRead != sizeof(aout) ||
  380.     PROC_BAD_MAGIC_NUMBER(aout)) {
  381.     Mon_Printf("Bad a.out format\n");
  382.     return(-1);
  383. d65 7
  384. a71 5
  385.     Mon_Printf("Sprite size: %d", aout.code);
  386.     status = Fs_Read(handlePtr, PROC_CODE_FILE_OFFSET(aout), aout.code,
  387.               PROC_CODE_LOAD_ADDR(aout), &bytesRead);
  388.     if (status != SUCCESS ||
  389.     bytesRead != aout.code) {
  390. d79 9
  391. a87 5
  392.     Mon_Printf("+%d", aout.data);
  393.     status = Fs_Read(handlePtr, PROC_DATA_FILE_OFFSET(aout), aout.data,
  394.               PROC_DATA_LOAD_ADDR(aout), &bytesRead);
  395.     if (status != SUCCESS ||
  396.     bytesRead != aout.data) {
  397. d89 1
  398. a89 1
  399.     Mon_Printf("\nShort read\n");
  400. d97 4
  401. a100 3
  402.     Mon_Printf("+%d", aout.bss);
  403.     addr = (int *) PROC_BSS_LOAD_ADDR(aout);
  404.     for (i = 0; i < aout.bss; i += 4, addr++) {
  405. d105 1
  406. a105 1
  407.     return (PROC_CODE_LOAD_ADDR(aout));
  408. @
  409.  
  410.  
  411. 1.2
  412. log
  413. @name change
  414. @
  415. text
  416. @d11 1
  417. a11 1
  418. static char rcsid[] = "$Header: fileLoad.c,v 1.1 86/07/17 13:19:16 brent Exp $ SPRITE (Berkeley)";
  419. d39 1
  420. a39 1
  421.     FsHandle    *handlePtr;
  422. d44 3
  423. a46 3
  424.     int            *addr;
  425.     ReturnStatus    status;
  426.     int            i;
  427. d55 1
  428. a55 1
  429.     Mon_Printf("Couldn't read a.out format\n");
  430. d66 3
  431. a68 3
  432.     if (status != SUCCESS) {
  433.     Mon_Printf("\nCould not read code\n");
  434.     return(-1);
  435. a69 4
  436.     if (bytesRead != aout.code) {
  437.     Mon_Printf("\nShort read\n");
  438.     return(-1);
  439.     }
  440. d76 1
  441. a76 1
  442.     status = Fs_Read(handlePtr, PROC_DATA_FILE_OFFSET(aout), aout.code,
  443. d78 3
  444. a80 5
  445.     if (status != SUCCESS) {
  446.     Mon_Printf("\nCould not read initialized data\n");
  447.     return(-1);
  448.     }
  449.     if (bytesRead != aout.code) {
  450. @
  451.  
  452.  
  453. 1.1
  454. log
  455. @Initial revision
  456. @
  457. text
  458. @d11 1
  459. a11 1
  460. static char rcsid[] = "$Header: proto.c,v 1.4 86/03/20 14:00:11 andrew Exp $ SPRITE (Berkeley)";
  461. d52 1
  462. a52 1
  463.     status = BootRead(handlePtr, 0, sizeof(aout), &aout, &bytesRead);
  464. d64 1
  465. a64 1
  466.     status = BootRead(handlePtr, PROC_CODE_FILE_OFFSET(aout), aout.code,
  467. d80 1
  468. a80 1
  469.     status = BootRead(handlePtr, PROC_DATA_FILE_OFFSET(aout), aout.code,
  470. @
  471.